package com.wg.net.server.tcp;

import com.wg.net.NetProtocol;
import com.wg.net.server.tcp.init.InitializeHandler;
import com.wg.net.server.tcp.init.SocketInitializeHandler;
import com.wg.net.server.tcp.init.WebsocketInitializeHandler;

import cn.hutool.log.Log;
import cn.hutool.log.LogFactory;

import java.util.EnumMap;
import java.util.Map;

/**
 * 初始化处理器管理器（单例模式，管理不同协议对应的初始化处理器）
 *
 * @author 少爷123
 */
public class InitializeHandlerManager {
    private static final Log log = LogFactory.get();
    // 使用EnumMap存储协议类型与处理器的映射（线程安全且高效）
    private final Map<NetProtocol, InitializeHandler> protocolHandlers;

    private InitializeHandlerManager() {
        protocolHandlers = new EnumMap<>(NetProtocol.class);
        // 初始化默认处理器（可根据需要扩展其他协议）
        protocolHandlers.put(NetProtocol.TCP, new SocketInitializeHandler());
        protocolHandlers.put(NetProtocol.WEBSOCKET, new WebsocketInitializeHandler());
    }

    /**
     * 获取单例实例（静态内部类实现，线程安全且懒加载）
     */
    public static InitializeHandlerManager getInstance() {
        return Singleton.INSTANCE.getManager();
    }

    /**
     * 根据协议类型获取对应的初始化处理器
     *
     * @param protocol 协议类型
     * @return 对应的初始化处理器（若未找到返回null）
     */
    public InitializeHandler getHandler(NetProtocol protocol) {
        return protocolHandlers.get(protocol);
    }

    /**
     * 注册新的协议处理器（支持扩展）
     *
     * @param protocol 协议类型
     * @param handler  对应的处理器
     */
    public void registerHandler(NetProtocol protocol, InitializeHandler handler) {
        if (protocol == null || handler == null) {
            log.warn("注册失败：协议类型或处理器为空");
            return;
        }
        protocolHandlers.put(protocol, handler);
        log.info("成功注册协议处理器：{} -> {}", protocol, handler.getClass().getSimpleName());
    }

    private enum Singleton {
        INSTANCE;
        private final InitializeHandlerManager manager;

        Singleton() {
            this.manager = new InitializeHandlerManager();
        }

        public InitializeHandlerManager getManager() {
            return manager;
        }
    }
}